#!/bin/bash

# x11vnc 完整静态编译脚本
# 自动编译libvncserver和x11vnc，生成最小静态版本

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 打印函数
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 项目路径
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SRC_DIR="$PROJECT_ROOT/vnc-source-code"
RESULT_DIR="$PROJECT_ROOT/result"
TEMP_DIR="$PROJECT_ROOT/temp"

print_info "=== x11vnc 完整静态编译开始 ==="
print_info "项目根目录: $PROJECT_ROOT"

# 检查源代码目录
if [ ! -d "$SRC_DIR" ]; then
    print_error "源代码目录不存在: $SRC_DIR"
    exit 1
fi

# 创建结果目录
mkdir -p "$RESULT_DIR"/{bin,lib,include,share/man/man1,share/applications}
mkdir -p "$TEMP_DIR"

# 检查依赖（跳过安装，假设已安装）
print_info "检查编译依赖..."
if ! command -v cmake >/dev/null 2>&1; then
    print_error "cmake未安装，请先安装依赖"
    exit 1
fi

if ! command -v gcc >/dev/null 2>&1; then
    print_error "gcc未安装，请先安装依赖"
    exit 1
fi

print_success "依赖检查通过"

# 第一阶段：编译libvncserver静态库
print_info "=== 第一阶段：编译libvncserver静态库 ==="

cd "$SRC_DIR/libvncserver"

# 创建构建目录
mkdir -p build
cd build

# 清理之前的构建
rm -rf *

# 配置CMake（最小化配置）
print_info "配置libvncserver..."
cmake .. \
    -DCMAKE_INSTALL_PREFIX="$RESULT_DIR" \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=OFF \
    -DENABLE_WAYLAND=OFF \
    -DENABLE_GNUTLS=OFF \
    -DENABLE_OPENSSL=OFF \
    -DENABLE_SASL=OFF \
    -DENABLE_SYSTEMD=OFF \
    -DENABLE_TESTS=OFF \
    -DENABLE_EXAMPLES=OFF \
    -DENABLE_CLIENT_TESTS=OFF \
    -DWITH_ZLIB=ON \
    -DWITH_JPEG=ON \
    -DWITH_PNG=ON \
    -DWITH_LZO=ON \
    -DWITH_FFMPEG=OFF \
    -DWITH_GCRYPT=ON

# 编译静态库
print_info "编译libvncserver静态库..."
make -j$(nproc) || make vncserver vncclient 2>/dev/null || true

# 安装静态库
print_info "安装libvncserver静态库..."
if [ -f "libvncserver.a" ] && [ -f "libvncclient.a" ]; then
    cp libvncserver.a "$RESULT_DIR/lib/"
    cp libvncclient.a "$RESULT_DIR/lib/"
    cp -r ../include/rfb "$RESULT_DIR/include/"
    print_info "手动复制静态库完成"
else
    make install || print_warning "安装可能不完整"
fi

# 第二阶段：编译x11vnc
print_info "=== 第二阶段：编译x11vnc ==="

cd "$SRC_DIR/x11vnc"

# 清理之前的构建
if [ -f "Makefile" ]; then
    make clean
fi

# 重新生成configure
if [ ! -f "configure" ]; then
    ./autogen.sh
fi

# 最小化配置
print_info "配置x11vnc（最小配置）..."
./configure \
    --prefix="$RESULT_DIR" \
    --without-ssl \
    --without-avahi \
    --without-xrecord \
    --without-xdamage \
    --without-xfixes \
    --without-xcomposite \
    --without-xinerama \
    --without-xrandr \
    --without-dpms \
    --without-fbpm \
    --without-v4l \
    --without-linuxfb \
    --without-mac \
    --without-crypto \
    CPPFLAGS="-I$RESULT_DIR/include -I/usr/include/X11" \
    LDFLAGS="-L$RESULT_DIR/lib -L/usr/lib/x86_64-linux-gnu"

# 编译x11vnc
print_info "编译x11vnc..."
make LDFLAGS="-L$RESULT_DIR/lib -L/usr/lib/x86_64-linux-gnu -static-libgcc -static-libstdc++" \
     CFLAGS="-I$RESULT_DIR/include -I/usr/include/X11" \
     LIBS="-lvncserver -lvncclient -ljpeg -lpng -lz -lm -lpthread -ldl -lgcrypt -lX11 -lXtst -lXext -lssl -lcrypto -llzo2 -lgnutls -lsasl2" \
     -j$(nproc)

# 安装x11vnc
print_info "安装x11vnc..."
make install

# 第三阶段：验证和打包
print_info "=== 第三阶段：验证和打包 ==="

# 验证编译结果
if [ -f "$RESULT_DIR/bin/x11vnc" ]; then
    print_success "x11vnc二进制文件生成成功"
    
    # 显示文件信息
    ls -lh "$RESULT_DIR/bin/x11vnc"
    file "$RESULT_DIR/bin/x11vnc"
    
    # 显示动态链接依赖
    print_info "动态链接依赖:"
    ldd "$RESULT_DIR/bin/x11vnc" | head -10
    
    # 显示版本信息
    print_info "版本信息:"
    "$RESULT_DIR/bin/x11vnc" -version 2>/dev/null || echo "无法获取版本信息"
else
    print_error "x11vnc二进制文件生成失败"
    exit 1
fi

# 创建便携包
print_info "创建便携包..."
PORTABLE_DIR="$TEMP_DIR/x11vnc-static-$(date +%Y%m%d)"
mkdir -p "$PORTABLE_DIR"/{bin,lib,doc,scripts}

# 复制二进制文件
cp "$RESULT_DIR/bin/x11vnc" "$PORTABLE_DIR/bin/"
cp "$RESULT_DIR/bin/Xdummy" "$PORTABLE_DIR/bin/" 2>/dev/null || true

# 复制静态库
cp "$RESULT_DIR/lib"/*.a "$PORTABLE_DIR/lib/" 2>/dev/null || true

# 复制文档
cp -r "$RESULT_DIR/include" "$PORTABLE_DIR/" 2>/dev/null || true
cp "$PROJECT_ROOT/doc"/*.md "$PORTABLE_DIR/doc/" 2>/dev/null || true

# 创建README
cat > "$PORTABLE_DIR/README.md" << 'EOF'
# x11vnc 静态编译版本

## 编译信息
- 编译时间: $(date)
- 编译方式: 静态编译libvncserver + 半静态编译x11vnc
- 版本: x11vnc 0.9.17
- 目标系统: Linux x86_64

## 功能特性
- ✅ 基础VNC功能
- ✅ JPEG/PNG压缩
- ✅ WebSockets支持
- ✅ 多显示器基础支持
- ✅ 键盘鼠标控制
- ✅ 剪贴板支持
- ❌ SSL/TLS加密（已禁用）
- ❌ Avahi零配置（已禁用）
- ❌ XRecord扩展（已禁用）
- ❌ XDamage扩展（已禁用）

## 文件说明
```
bin/
├── x11vnc          # 主程序
└── Xdummy          # 虚拟X服务器辅助工具

lib/                # 静态库文件
├── libvncserver.a  # VNC服务器静态库
└── libvncclient.a  # VNC客户端静态库

include/            # 头文件
doc/                # 文档
scripts/            # 脚本文件
```

## 快速使用

### 基本启动
```bash
# 基本启动
./bin/x11vnc -display :0

# 设置密码
./bin/x11vnc -display :0 -passwd your_password

# 指定端口
./bin/x11vnc -display :0 -rfbport 5900

# 后台运行
./bin/x11vnc -display :0 -bg -o /tmp/x11vnc.log
```

### 高级选项
```bash
# 设置视图Only密码
./bin/x11vnc -display :0 -passwd view:1234 -full:5678

# 限制连接IP
./bin/x11vnc -display :0 -allow 192.168.1.0/24

# 设置分辨率
./bin/x11vnc -display :0 -geometry 1024x768

# 启用压缩
./bin/x11vnc -display :0 -compresslevel 6 -quality 8
```

## 系统要求
- Linux x86_64
- X11 Server
- 基础系统库（glibc, libX11等）

## 安全注意事项
1. 此版本禁用了SSL加密，仅适用于安全网络环境
2. 建议使用强密码保护VNC连接
3. 在生产环境中建议配置防火墙规则
4. 避免在公网直接暴露VNC端口

## 故障排除

### 常见问题
1. **无法连接X显示**
   - 确保X服务器正在运行
   - 检查DISPLAY环境变量
   - 尝试使用Xdummy创建虚拟显示

2. **权限问题**
   - 确保用户有访问X服务器的权限
   - 尝试使用xhost +命令

3. **端口被占用**
   - 使用-netstat查看端口占用
   - 使用-rfbport指定其他端口

### 调试模式
```bash
# 启用详细日志
./bin/x11vnc -display :0 -debug -o /tmp/x11vnc.log

# 前台运行查看输出
./bin/x11vnc -display :0 -forever
```

## 技术支持
- 项目主页: https://github.com/LibVNC/x11vnc
- 文档: 参考 $PORTABLE_DIR/doc/ 目录
- 问题反馈: 请通过GitHub Issues报告

## 许可证
本软件遵循GPL-2.0许可证
EOF

# 创建启动脚本
cat > "$PORTABLE_DIR/scripts/start-x11vnc.sh" << 'EOF'
#!/bin/bash

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
X11VNC_BIN="$SCRIPT_DIR/../bin/x11vnc"

if [ ! -f "$X11VNC_BIN" ]; then
    echo "错误: 找不到x11vnc二进制文件"
    exit 1
fi

chmod +x "$X11VNC_BIN"

echo "x11vnc 静态编译版本启动脚本"
echo "============================"

# 检查参数
if [ $# -eq 0 ]; then
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  basic     - 基本启动（默认）"
    echo "  password  - 设置密码启动"
    echo "  debug     - 调试模式启动"
    echo "  help      - 显示帮助"
    echo ""
    read -p "请选择启动模式 [basic]: " mode
    mode=${mode:-basic}
else
    mode=$1
fi

# 设置DISPLAY
if [ -z "$DISPLAY" ]; then
    export DISPLAY=:0
    echo "设置DISPLAY=$DISPLAY"
fi

case $mode in
    "basic")
        echo "启动x11vnc（基本模式）..."
        echo "连接方式: vncviewer <本机IP>:5900"
        echo "按Ctrl+C停止服务"
        exec "$X11VNC_BIN" -display "$DISPLAY" -rfbport 5900
        ;;
    "password")
        read -s -p "请输入VNC密码: " passwd
        echo
        echo "启动x11vnc（密码模式）..."
        echo "连接方式: vncviewer <本机IP>:5900"
        echo "密码: $passwd"
        echo "按Ctrl+C停止服务"
        exec "$X11VNC_BIN" -display "$DISPLAY" -rfbport 5900 -passwd "$passwd"
        ;;
    "debug")
        echo "启动x11vnc（调试模式）..."
        echo "日志文件: /tmp/x11vnc_debug.log"
        echo "按Ctrl+C停止服务"
        exec "$X11VNC_BIN" -display "$DISPLAY" -rfbport 5900 -debug -o /tmp/x11vnc_debug.log
        ;;
    "help"|"-h"|"--help")
        echo "x11vnc 启动脚本帮助"
        echo "=================="
        echo ""
        echo "启动模式:"
        echo "  basic     - 基本启动，无密码"
        echo "  password  - 设置密码启动"
        echo "  debug     - 调试模式，输出详细日志"
        echo ""
        echo "手动启动示例:"
        echo "  $X11VNC_BIN -display :0"
        echo "  $X11VNC_BIN -display :0 -passwd mypassword"
        echo "  $X11VNC_BIN -display :0 -rfbport 5901"
        echo ""
        echo "更多选项请参考: $X11VNC_BIN --help"
        ;;
    *)
        echo "未知模式: $mode"
        echo "使用 '$0 help' 查看帮助"
        exit 1
        ;;
esac
EOF

chmod +x "$PORTABLE_DIR/scripts/start-x11vnc.sh"

# 创建系统服务脚本
cat > "$PORTABLE_DIR/scripts/x11vnc.service" << 'EOF'
[Unit]
Description=x11vnc VNC Server
After=graphical-session.target

[Service]
Type=simple
ExecStart=/opt/x11vnc/bin/x11vnc -display :0 -rfbport 5900 -forever
Restart=on-failure
RestartSec=5
User=vnc
Group=vnc

[Install]
WantedBy=multi-user.target
EOF

# 创建安装脚本
cat > "$PORTABLE_DIR/scripts/install.sh" << 'EOF'
#!/bin/bash

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="/opt/x11vnc"

echo "x11vnc 安装脚本"
echo "==============="

# 检查权限
if [ "$EUID" -ne 0 ]; then
    echo "错误: 需要root权限安装到系统目录"
    echo "请使用: sudo $0"
    exit 1
fi

# 创建安装目录
mkdir -p "$INSTALL_DIR"

# 复制文件
echo "复制文件到 $INSTALL_DIR..."
cp -r "$SCRIPT_DIR/../bin" "$INSTALL_DIR/"
cp -r "$SCRIPT_DIR/../lib" "$INSTALL_DIR/"
cp -r "$SCRIPT_DIR/../include" "$INSTALL_DIR/"
cp -r "$SCRIPT_DIR/../doc" "$INSTALL_DIR/"
cp -r "$SCRIPT_DIR" "$INSTALL_DIR/scripts"

# 创建符号链接
ln -sf "$INSTALL_DIR/bin/x11vnc" /usr/local/bin/x11vnc

# 设置权限
chmod +x "$INSTALL_DIR/bin/x11vnc"
chmod +x "$INSTALL_DIR/scripts"/*.sh

# 安装systemd服务（可选）
read -p "是否安装systemd服务? [y/N]: " install_service
if [[ $install_service =~ ^[Yy]$ ]]; then
    cp "$SCRIPT_DIR/x11vnc.service" /etc/systemd/system/
    systemctl daemon-reload
    echo "systemd服务已安装，使用以下命令管理："
    echo "  启动: systemctl start x11vnc"
    echo "  停止: systemctl stop x11vnc"
    echo "  开机自启: systemctl enable x11vnc"
fi

echo "安装完成！"
echo "x11vnc已安装到: $INSTALL_DIR"
echo "启动命令: x11vnc -display :0"
echo "或使用脚本: $INSTALL_DIR/scripts/start-x11vnc.sh"
EOF

chmod +x "$PORTABLE_DIR/scripts/install.sh"

# 创建压缩包
cd "$TEMP_DIR"
tar -czf "x11vnc-static-$(date +%Y%m%d).tar.gz" "x11vnc-static-$(date +%Y%m%d)/"

# 总结
print_success "=== x11vnc 静态编译完成 ==="
print_info "编译结果位置:"
print_info "  二进制文件: $RESULT_DIR/bin/x11vnc"
print_info "  静态库: $RESULT_DIR/lib/"
print_info "  便携包: $TEMP_DIR/x11vnc-static-$(date +%Y%m%d).tar.gz"
print_info "  包大小: $(du -h "$TEMP_DIR/x11vnc-static-$(date +%Y%m%d).tar.gz" | cut -f1)"

print_info "编译特性:"
print_info "  ✅ 静态链接: libvncserver, libvncclient"
print_info "  ✅ 动态链接: X11库, 系统库"
print_info "  ✅ 最小化配置: 禁用复杂依赖"
print_info "  ✅ 便携包: 包含完整文档和脚本"

print_info "使用方法:"
print_info "  直接运行: $RESULT_DIR/bin/x11vnc -display :0"
print_info "  便携包: 解压后运行 scripts/start-x11vnc.sh"
print_info "  系统安装: 解压后运行 scripts/install.sh"

print_success "编译任务完成！"
